package com.mindskip.xzs.controller.admin;
//这段代码是一个Spring Boot控制器类，用于处理管理员对消息的操作请求。它在前后端的作用如下：
//请求接口
//前端调用这些接口来执行消息管理的各种操作，如分页查询消息列表、发送消息等。
//每个方法对应一个特定的URL路径，前端通过发送HTTP请求（POST请求）来与这些接口交互。
//数据交互
//前端通过发送带有JSON数据的请求体（`@RequestBody`）来传递所需的参数。
//返回的数据也是JSON格式，前端通过解析响应数据来展示消息信息或确认操作结果。
//依赖注入
//使用`@Autowired`注解将`MessageService`和`UserService`的实例注入到控制器中，方便调用服务层的方法。
//使用`@Resource`注解注入`TaskResultServer`和`SendEmail`类。
//方法功能
//`pageList`: 处理分页获取消息列表的请求。调用服务层获取消息信息，并将数据转换为视图模型后返回给前端。
//`sendTo`: 处理发送消息的请求。验证请求数据后，根据任务ID和结果ID获取用户信息，发送邮件通知，并返回操作结果。
//分页获取消息列表
//- **URL**: `/api/admin/message/page`
//- **HTTP方法**: POST
//- **请求体**: `MessagePageRequestVM`，包含分页参数和查询条件。
//- **处理流程**:
//  1. 从`MessageService`中获取分页消息列表。
//  2. 提取消息ID列表，并根据这些ID获取消息用户列表。
//  3. 使用`modelMapper`将消息实体转换为响应视图模型（`MessageResponseVM`）。
//  4. 拼接消息接收者的用户名，并格式化创建时间。
//  5. 返回分页信息。
//发送消息
//- **URL**: `/api/admin/message/sendTo`
//- **HTTP方法**: POST
//- **请求体**: `MessageSendVM`，包含消息内容、任务ID和结果ID。
//- **处理流程**:
//  1. 根据任务ID和结果ID从`TaskResultServer`中获取用户信息。
//  2. 提取用户的邮箱地址并拼接成字符串。
//  3. 调用`SendEmail`类发送邮件。
//  4. 返回操作结果。
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.base.BaseApiController;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.Message;
import com.mindskip.xzs.domain.MessageUser;
import com.mindskip.xzs.domain.User;
import com.mindskip.xzs.service.MessageService;
import com.mindskip.xzs.service.TaskResultServer;
import com.mindskip.xzs.service.UserService;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.PageInfoHelper;
import com.mindskip.xzs.viewmodel.admin.message.MessagePageRequestVM;
import com.mindskip.xzs.viewmodel.admin.message.MessageResponseVM;
import com.mindskip.xzs.viewmodel.admin.message.MessageSendVM;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@RestController("AdminMessageController")
@RequestMapping(value = "/api/admin/message")
public class MessageController extends BaseApiController {

    private final MessageService messageService;
    private final UserService userService;

    @Autowired
    public MessageController(MessageService messageService, UserService userService) {
        this.messageService = messageService;
        this.userService = userService;
    }

    @Resource
    private TaskResultServer taskResultServer;

    // 分页获取消息列表的接口
    @RequestMapping(value = "/page", method = RequestMethod.POST)
    public RestResponse<PageInfo<MessageResponseVM>> pageList(@RequestBody MessagePageRequestVM model) {
        PageInfo<Message> pageInfo = messageService.page(model); // 获取分页消息
        List<Integer> ids = pageInfo.getList().stream().map(Message::getId).collect(Collectors.toList());// 获取消息的 ID 列表
        List<MessageUser> messageUsers = ids.size() == 0 ? null : messageService.selectByMessageIds(ids);// 根据消息 ID 获取消息用户列表
        PageInfo<MessageResponseVM> page = PageInfoHelper.copyMap(pageInfo, m -> {
            MessageResponseVM vm = modelMapper.map(m, MessageResponseVM.class);// 将消息转换为响应视图模型
            String receives = null;
            if (messageUsers != null) {
                // 获取消息接收者的用户名并拼接成字符串
                receives = messageUsers.stream().filter(d -> d.getMessageId().equals(m.getId())).map(MessageUser::getReceiveUserName)
                        .collect(Collectors.joining(","));
            }
            vm.setReceives(receives);// 设置接收者
            vm.setCreateTime(DateTimeUtil.dateFormat(m.getCreateTime()));// 格式化创建时间
            return vm;
        });
        return RestResponse.ok(page);// 返回分页信息
    }

    // 发送消息的接口
    @RequestMapping(value = "/sendTo" ,method = RequestMethod.POST)
    public  RestResponse sendTo(@RequestBody @Valid  MessageSendVM model){
        // 根据任务 ID 和结果 ID 获取用户
        List<User> toUsers=userService.selectByIds(taskResultServer.getUserIdByTaskIdAndResultIds(model.getResultId(),model.getTaskId()));
        StringBuilder toEmail= new StringBuilder();
        for(User user1:toUsers){
            if(!Objects.equals(user1.getEmail(), "")) {
                toEmail.append(user1.getEmail()).append(",");// 拼接用户邮箱
            }
        }

            return RestResponse.ok();
    }

}
